<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        0. es5中函数内部对象:  arguments this
            es6新增:          new.target
     */

    /*
        1.arguments
            -arguments.callee:是一个指向 arguments 对象所在函数的 指针
     */

    // 普通
    function factorial(num) {
        if (num <= 1) {
            return 1;
        } else {
            return num * factorial(num - 1)
        }
    }

    // 使用 arguments.callee
    function nextFactorial(num) {
        if (num <= 1) {
            return 1;
        } else {
            return num * arguments.callee(num - 1)
        }
    }
    
    // 比较
    let otherFactorial = nextFactorial;
    nextFactorial = function(){
        return 0
    }
    console.log(otherFactorial(5))  // 120
    console.log(nextFactorial(5))  //0

    /*
        2.this
     */
    // 普通的this,就看前面的一个逗号是谁
    // 箭头函数的this,指向外层
    
    /*
        3. caller
            - functionName.caller :指向调用者,如果是全局作用域就返回null
            - 不能给caller赋值
     */
    console.log('---3---')
    function outer() {
        inner();
    }
    function inner() {
        console.log(inner.caller)
        // 或者 降低耦合
        // console.log(arguments.callee.caller)
    }
    outer();  // outer对象
    inner(); // null
    
    /*
        4.new.target
            - 检测是否使用了new关键字,是则new.target将引用被调用的 构造函数。,否则返回undefined
     */
    
    function King() {
        if(!new.target){
            console.log('不是用new')
        }else {
            console.log('是new出来的')
        }
    }
    King();
    new King();
    

</script>
</body>
</html>